/*
@author: tian-yan-tian-ge
@file: 2023.11.24密码复杂度.go
@time: 2023/11/25 20:13
*/
package main

import (
	"strings"
)

func passwordComplexity(password string) (int, string) {
	score := 0
	message := ""

	// 长度超过8位（必须）+1分
	if len(password) > 8 {
		score += 1
	}

	// 包括大、小写字母.数字.其它符号，以上四种至少三种+1分
	count := 0
	for _, char := range password {
		if isLetter(char) || isDigit(char) {
			count++
		}
		if count > 3 {
			score += 1
			break
		}
	}

	// 不能有长度超过或等于3的子串重复+1分
	for i := 0; i < len(password)-2; i++ {
		if strings.Count(password, password[i:i+3]) > 1 {
			score += 1
			break
		}
	}

	// 密码的评分等级，默认2分，以上条件满足一条加1分
	if score == 0 {
		score = 2
	} else {
		score += 3 // 根据图片描述，以上条件满足一条加1分，这里加3分是因为有三个条件都满足
	}

	// 返回密码的评分等级和需要改进的点
	if score < 3 {
		message = "密码过于简单，长度小于8，没有由3种以上字符组成。"
	} else if score == 3 {
		message = "密码符合基本要求，建议增加长度和复杂性以提升安全性。"
	} else {
		message = "密码非常复杂，安全性很高，无需改进。"
	}

	return score, message
}

func isLetter(char rune) bool {
	return char >= 'a' && char <= 'z' || char >= 'A' && char <= 'Z'
}

func isDigit(char rune) bool {
	return char >= '0' && char <= '9'
}
